home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cpp_libs / intrvews / xgrab.lha / xgrab / ui / fonthandler.c < prev    next >
C/C++ Source or Header  |  1990-03-06  |  5KB  |  195 lines

  1. /**
  2.    GRAB Graph Layout and Browser System
  3.  
  4.    Copyright (c) 1989, Tera Computer Company
  5.  **/
  6.  
  7.   /**
  8.      Handler for font information for the xgrab window, including the
  9.      node and edge labels, and for postscript output.  
  10.  
  11.      There are six fonts used for node and edge labels in the xgrab
  12.      window.  From largest to smallest:
  13.      new century schoolbook 12pt
  14.      new century schoolbook 10pt
  15.      helvetica        10pt
  16.      new century schoolbook  8pt
  17.      helvetica         8pt
  18.      times             8pt
  19.      The helvetica fonts are skinnier than new century, and the times is
  20.      even skinnier.
  21.  
  22.      'stdfont' is used for text in other parts of the xgrab window.  The
  23.      postscript routines have their own default font.
  24.  
  25.      As the size of the nodes grows and shrinks on the screen, the program
  26.      attempts to change the font so that the node labels fit inside the
  27.      nodes.  The edge labels are never bigger than the node labels.  The
  28.      file contains routines to set the fonts, find the size of a string
  29.      in a given font, and so on.
  30.    **/
  31.  
  32. #include "fonthandler.h"
  33. #include <stdio.h>
  34. #define MIN(a,b) (((a)<(b))?(a):(b))
  35.  
  36.   /**
  37.      The following numbers are lies in that the fonts aren't really this
  38.      big (they certainly aren't bigger).  True widths can't be given
  39.      since all the fonts are variable width.  True heights could be given,
  40.      but then we'd end up seeing the same fonts over and over and it'd
  41.      be really tedious.
  42.  
  43.      The font names are found in /usr/lib/X11/fonts/75dpi/fonts.dir
  44.    **/
  45. static int Font_Widths[numberfonts] = { 12, 10,  9,  8,  7, 6};
  46. static int Font_Heights[numberfonts] = { 22, 16, 16, 16, 13, 10};
  47. static char *Font_Names[numberfonts] = 
  48. {
  49.     "-adobe-new century schoolbook-medium-r-normal--12-120-75-75-p-70-iso8859-1",
  50.     "-adobe-new century schoolbook-medium-r-normal--10-100-75-75-p-60-iso8859-1",
  51.     "-adobe-helvetica-medium-r-normal--10-100-75-75-p-56-iso8859-1",
  52.     "-adobe-new century schoolbook-medium-r-normal--8-80-75-75-p-50-iso8859-1",
  53.     "-adobe-helvetica-medium-r-normal--8-80-75-75-p-46-iso8859-1",
  54.     "-adobe-times-medium-r-normal--8-80-75-75-p-44-iso8859-1"
  55. };
  56.  
  57. FontHandler::FontHandler()
  58.   /**
  59.      The fonthandler keeps track of the current edge, node, text and
  60.      postscript output fonts and whether node and edge labels are forced
  61.    **/
  62. {
  63.     int i;
  64.  
  65.       /**
  66.      The edge label map array tells which font to use for a given
  67.      node font.  In general, use the one 3 smaller than this one, unless
  68.      there is no such font, in which case use the smallest one
  69.        **/
  70.     for (i = 0; i < numberfonts; i++) 
  71.     {
  72.         FontArray[i] = new Font(Font_Names[i]);
  73.         EdgeLabelMapArray[i] = MIN(i+3, numberfonts-1);
  74.     }
  75.  
  76.     newScreen();
  77.     text_flag = true;
  78.     nlabel_forced = false;
  79.     elabel_forced = false;
  80.     psfont = nil;
  81. }
  82.  
  83. void FontHandler::SetPS(char* name)
  84.   /* Set the postscript output font */
  85. {
  86.     psfont = new Font(name);
  87. }
  88.  
  89. int FontHandler::WidthPS(char* str)
  90.   /* Find the width of a string in the postscript font */
  91. {
  92.     return psfont->Width(str);
  93. }
  94.  
  95. void FontHandler::newScreen()
  96. {
  97.     text_font = stdfont;
  98.     node_font = FontArray[startfont];
  99.     edge_font = FontArray[EdgeLabelMapArray[startfont]];
  100. }
  101.  
  102. void FontHandler::set_fonts(int font_num)
  103. {
  104.     node_font = FontArray[font_num];
  105.     edge_font = FontArray[EdgeLabelMapArray[font_num]];
  106. }
  107.  
  108. void FontHandler::set_font(int sizex, int sizey)
  109.   /* set the font to the one no larger than sizex X sizey */
  110. {
  111.     int i, j;
  112.  
  113.     text_flag = true;            /* assume can draw text */
  114.  
  115.     for (i = 0; i < numberfonts; i++) 
  116.     {
  117.         if (sizex >= Font_Widths[i])
  118.     {
  119.             break;
  120.     }
  121.     }
  122.  
  123.     for (j = i; j < numberfonts; j++) 
  124.     {
  125.         if (sizey >= Font_Heights[j])
  126.     {
  127.             break;
  128.     }
  129.     }
  130.  
  131.     if (j >= numberfonts) 
  132.     {
  133.         text_flag = false;
  134.           /** 
  135.          set to smallest font in case we want to force
  136.              the printing of the labels 
  137.        **/
  138.         set_fonts(numberfonts - 1);
  139.     }
  140.     else
  141.     {
  142.         set_fonts(j);
  143.     }
  144. }
  145.  
  146. boolean FontHandler::FontWillFit(int sizex, int sizey)
  147.   /* return true if there is a font which is smaller than sizex X sizey */
  148. {
  149.     int i;
  150.  
  151.     for (i = 0; i < numberfonts; i++) 
  152.     {
  153.         if ((sizex >= Font_Widths[i]) && (sizey >= Font_Heights[i]))
  154.         {
  155.         break;
  156.     }
  157.     }
  158.  
  159.     if (i >= numberfonts) 
  160.     {
  161.         return false;
  162.     }
  163.     else
  164.     {
  165.         return true;
  166.     }
  167. }
  168.  
  169. void FontHandler::force_nlabel()
  170. {
  171.     nlabel_forced = true;
  172. }
  173.  
  174. void FontHandler::noforce_nlabel()
  175. {
  176.     nlabel_forced = false;
  177. }
  178.  
  179. void FontHandler::force_elabel()
  180. {
  181.     elabel_forced = true;
  182. }
  183.  
  184. void FontHandler::noforce_elabel()
  185. {
  186.     elabel_forced = false;
  187. }
  188.  
  189. void FontHandler::SmallestFont(int* width, int* height)
  190.   /* return the size of the smallest font */
  191. {
  192.     *width = Font_Widths[numberfonts - 1];
  193.     *height = Font_Heights[numberfonts - 1];
  194. }
  195.